source of inspiration
Installation
uninstall image (if needed)
# wsl --unregister <distroName>
--unregister ubuntu-22.04 wsl
download images
From cloud images ubuntu (cloud-images > jammy > current), now there are wsl images:
I just have to download the last jammy (22.04) image jammy-server-cloudimg-amd64-wsl.rootfs.tar.gz
install and setup from powershell
I have downloaded this ubuntu image to D:\wsl\ubuntu-22.04\download
(base) guillaume@LL11LPC0PQARQ:/mnt/d/wsl$ tree
.
├── Ubuntu-20.04
│ └── ext4.vhdx
├── Ubuntu-22.04
│ ├── download
│ │ └── jammy-server-cloudimg-amd64-wsl.rootfs.tar.gz
│ └── instance
and my ubuntu-22.04
instance will stand in D:\wsl\ubuntu-22.04\instance
Install with this command from powershell
# wsl --import <distroname> <location of instance> <location of download>
--import ubuntu-22.04 D:\wsl\ubuntu-22.04\instance D:\wsl\ubuntu-22.04\download\jammy-server-cloudimg-amd64-wsl.rootfs.tar.gz wsl
It takes 3-4 minutes to install. and should be visible in your wsl instances.
--list --all -v
wsl
NAME STATE VERSION.04 Stopped 2 ubuntu-22
then to run it
# wsl -d <distroname>
-d ubuntu-22.04 wsl
or
use Windows Terminal as a launcher
Windows Terminal is a smart way to group all terminals (powershell, and all your wsl instances)
It can be installed even with limited windows store access by clicking install in Installer le Terminal Windows et commencer à le configurer
Automatically all wsl instances appear in Settings.
Automatic setup
copy these 2 scripts in /root/ (given they are in D:\wsl\ubuntu-22.04\download
)
cp /mnt/d/wsl/Ubuntu-22.04/download/setup_wsl_* .
setup_wsl_root.sh
download
#!/bin/bash
echo "0. get username: "
read user_name
. /etc/lsb-release
echo Configuration for user [$user_name]
echo of distribution $DISTRIB_CODENAME
echo
echo "1. create user and add in sudo"
#adduser --disabled-password --gecos "" $user_name
adduser --gecos "" $user_name
usermod -aG sudo $user_name
echo
echo "2. create wsl.conf file"
rm -rf /etc/wsl.conf
tee /etc/wsl.conf << EOF
# Set the user when launching a distribution with WSL.
[user]
default=$user_name
EOF
echo
echo "3. prepare setup by user"
cp setup_wsl_user.sh /home/$user_name
chown $user_name:users /home/$user_name/setup_wsl_user.sh
chmod 750 /home/$user_name/setup_wsl_user.sh
tee -a /home/$user_name/.bashrc << EOF
if [ ! -f ~/".wsl_configured" ]; then
~/setup_wsl_user.sh
touch ~/.wsl_configured
fi
EOF
echo
echo "end of configuration for root"
echo "stop wsl instance by running 'wsl -t <distro-name>' from powershell"
echo "and start from Windows Terminal"
setup_wsl_user.sh
download
#!/bin/bash
echo "1. setup wsl-vpnkit"
if grep -Fxq "wsl-vpnkit" ~/.profile
then
# code if found
echo " wsl-vpnkit already setup"
else
# code if not found
echo 'wsl.exe -d wsl-vpnkit service wsl-vpnkit start' >> ~/.profile
fi
wsl.exe -d wsl-vpnkit service wsl-vpnkit start
source ./.bashrc
echo
echo "2. create ssh key to copy to gitlab"
. /etc/lsb-release
if [ ! -e ".ssh/id_rsa.pub" ]; then
ssh-keygen -t rsa -b 4096 -C "WSL2 ubuntu $DISTRIB_RELEASE"
cat .ssh/id_rsa.pub
echo "copy this content to gitlab > preferences > SSH Keys"
read -p "Press any key to resume ..."
fi
echo
echo "3. update certificates"
if [ ! -n "$(grep "^gitlab.michelin.com " ~/.ssh/known_hosts)" ]; then ssh-keyscan gitlab.michelin.com >> ~/.ssh/known_hosts 2>/dev/null; fi
git clone git@gitlab.michelin.com:devops-foundation/devops_environment.git /tmp/devops_environment
sudo cp /tmp/devops_environment/certs/* /usr/local/share/ca-certificates/
sudo update-ca-certificates
rm -rf /tmp/devops_environment
if [ $DISTRIB_RELEASE == "22.04" ]
then
echo 'bug SSL with ubuntu 22.04 - https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/1963834/comments/7'
sudo tee -a /etc/ssl/openssl.cnf << EOF
[openssl_init]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
Options = UnsafeLegacyRenegotiation
EOF
fi
tee -a ~/.bashrc << EOF
export OPENSSL_CONF=/etc/ssl/openssl.cnf
EOF
echo
echo "4. update apt sources with artifactory"
echo 'Acquire { http::User-Agent "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.37) Gecko/20100101 Firefox/31.33.7"; };' | sudo tee /etc/apt/apt.conf.d/90globalprotectconf
sudo sed -i 's,http://archive.ubuntu.com/ubuntu,https://artifactory.michelin.com/artifactory/ubuntu-archive-remote,g' /etc/apt/sources.list
sudo sed -i 's,http://security.ubuntu.com/ubuntu,https://artifactory.michelin.com/artifactory/ubuntu-archive-remote,g' /etc/apt/sources.list
sudo apt update
sudo apt upgrade -y
echo
Then
chmod +x setup_wsl_root.sh
./setup_wsl_root.sh
As explained stop wsl instance by running wsl --shutdown ubuntu-22.04
from powershell and start from Windows Terminal
It restarts from your user and it will install:
- setup wsl-vpnkit
- create ssh key to copy to gitlab
- update certificates
- update apt sources with artifactory
And now we can install other parts
all the scripts are in https://github.com/castorfou/blog/tree/master/files
00 - keep config files in git
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_00_config_files_in_git.sh | bash
source .bashrc
01 - automount secured vbox
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_01_automount_secured_vbox.sh | bash
02 - python with conda and configure base environment (jupyterlab, mamba)
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_02_install_python_conda_part1.sh | bash
cd
source .bashrc
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_02_install_python_conda_part2.sh | bash
source .bashrc
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_02_install_python_conda_part3.sh | bash
source .bashrc
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_02_install_python_conda_part4.sh | bash
source .bashrc
03 - bat cat
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_03_install_batcat.sh | bash
source .bashrc
To use batcat
but not display line numbers, just use -p
option cat .bashrc -p
04 - git access
ln -s /mnt/d/git/ ~/
05 - X access with GWSL
if you have access to Windows Store, it is available.
Or alternate download are possible.
06 - git credential manager
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_06_git_credential_manager.sh | bash
07 - install wslu
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_07_wslu.sh | bash
Some examples:
$ wslfetch
.-/+oossssoo+/-. Windows Subsystem for Linux (WSL2)
`:+ssssssssssssssssss+:` guillaume@LL11LPC0PQARQ
-+ssssssssssssssssssyyssss+- Build: 19044
.ossssssssssssssssssdMMMNysssso. Branch: vb_release
/ssssssssssshdmmNNmmyNMMMMhssssss/ Release: Ubuntu 22.04 LTS
+ssssssssshmydMMMMMMMNddddyssssssss+ Kernel: Linux 5.10.102.1-microsoft-standard-WSL2
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Uptime: 0d 3h 44m
.ssssssssdMMMNhsssssssssshNMMMdssssssss.
+sssshhhyNMMNyssssssssssssyNMMMysssssss+
ossyNMMMNyMMhsssssssssssssshmmmhssssssso
ossyNMMMNyMMhsssssssssssssshmmmhssssssso
+sssshhhyNMMNyssssssssssssyNMMMysssssss+
.ssssssssdMMMNhsssssssssshNMMMdssssssss.
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
$ wslpath -u "C:\Program Files\Typora\Typora.exe"
/mnt/c/Program Files/Typora/Typora.exe
08 - configure pip
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_08_pip.sh | bash
09 - install vscode
code .
(given Visual Studio Code is installed on the Windows side (not in WSL))
(and if needed install Remote development)
10 - docker
wget --no-check-certificate --content-disposition -O - https://raw.githubusercontent.com/castorfou/blog/master/files/setup_wsl_10_docker.sh | bash
when relogging, docker service will be added to test docker
docker ps
docker run docker.artifactory.michelin.com/hello-world
Manual setup (skip if to follow automatic setup)
basic setup
With this way to install, you don’t have any user, you don’t have any launcher within Windows.
Create a user and add it to sudo:
# adduser <yourusername>
# usermod -aG sudo <yourusername>
adduser guillaume
usermod -aG sudo guillaume
and I can switch to this user simply with
# su <yourusername>
su guillaume
launch distro with yourusername - update wsl.conf
Manually you can now start your distro with your username from powershell
# wsl -d <distroname> -u <yourusername>
-d ubuntu-22.04 -u guillaume wsl
Or from another wsl (huge avantage to run in linux terminal instead of powershell)
wsl.exe -d ubuntu-22.04 -u guillaume
but you can better keep this username setting by updating wsl.conf
# /etc/wsl.conf
# Set the user when launching a distribution with WSL.
[user]
default=YourUserName
It is now setup. You can now shutdown this instance from powershell.
# wsl --shutdown <distroname>
--shutdown ubuntu-22.04 wsl
and when starting wsl -d ubuntu-22.04
, you reach your username.
wsl-vpnkit
As wsl-vpnkit is already installed, I just have to
echo 'wsl.exe -d wsl-vpnkit service wsl-vpnkit start' >> ~/.profile
source .bashrc
gitlab
ssh-keygen -t rsa -b 4096 -C "WSL2 ubuntu 22.04"
and copy id_rsa.pub
into gitlab > preferences > SSH Keys
corporate CA certificates
git clone git@gitlab.michelin.com:devops-foundation/devops_environment.git /tmp/devops_environment
sudo cp /tmp/devops_environment/certs/* /usr/local/share/ca-certificates/
sudo update-ca-certificates
rm -rf /tmp/devops_environment
apt sources
had to replace focal (20.04) to jammy (22.04)
echo 'Acquire { http::User-Agent "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.37) Gecko/20100101 Firefox/31.33.7"; };' | sudo tee /etc/apt/apt.conf.d/90globalprotectconf
sudo sed -i 's@^\(deb \)http://archive.ubuntu.com/ubuntu/\( jammy\(-updates\)\?.*\)$@\1https://artifactory.michelin.com/artifactory/ubuntu-archive-remote\2\n# &@' /etc/apt/sources.list
sudo sed -i 's@^\(deb \)http://security.ubuntu.com/ubuntu/\( jammy\(-updates\)\?.*\)$@\1https://artifactory.michelin.com/artifactory/ubuntu-security-remote\2\n# &@' /etc/apt/sources.list
check everything is ok
- This command must return google ip:
host google.fr
- This command must return artifactory ip:
host artifactory.michelin.com
- You are able to update your distribution without error:
sudo apt update
sudo apt upgrade -y
Setup config dotfiles with whole filesystem (/)
as detailed in keep dotfiles in git
but to manage the whole filesystem.
init local repo
sudo mkdir -p /.cfg
sudo chown $USER:users /.cfg
git init --bare /.cfg
alias config='/usr/bin/git --git-dir=/.cfg/ --work-tree=/'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=/.cfg/ --work-tree=/'" >> $HOME/.bash_aliases
cd
source .bashrc
git default identity (if needed)
config config --global user.email "guillaume.ramelet@michelin.com"
config config --global user.name "guillaume"
setup branch and push to central repo
config remote add origin git@gitlab.michelin.com:janus/dotfiles.git
config fetch
cd
config add .bashrc
config commit -m 'init with .bashrc'
config branch GR_WSL2_ubuntu22.04
config checkout GR_WSL2_ubuntu22.04
config push --set-upstream origin GR_WSL2_ubuntu22.04